package com.ddd.utils;

import java.util.List;
import java.util.regex.Pattern;


/**
 * @author liu
 */
public class FilterUtil {

    /**
     * 将通配符表达式转化为正则表达式
     *   * 表示匹配0或多个不是/的字符
     *   ** 表示匹配0或多个任意字符
     *   ? 表示匹配1个任意字符
     * @param path
     * @return
     */
    public static String getRegPath(String path) {
        char[] chars = path.toCharArray();
        int len = chars.length;
        StringBuilder sb = new StringBuilder();
        boolean preX = false;
        for(int i=0;i<len;i++){
            //遇到*字符
            if (chars[i] == '*'){
                //如果是第二次遇到*，则将**替换成.*
                if (preX){
                    sb.append(".*");
                    preX = false;
                }
                //如果是遇到单星，且单星是最后一个字符，则直接将*转成[^/]*
                else if(i+1 == len){
                    sb.append("[^/]*");
                }
                //否则单星后面还有字符，则不做任何动作，下一把再做动作
                else{
                    preX = true;
                    continue;
                }
            }
            //遇到非*字符
            else{
                //如果上一把是*，则先把上一把的*对应的[^/]*添进来
                if (preX){
                    sb.append("[^/]*");
                    preX = false;
                }
                //接着判断当前字符是不是?，是的话替换成.
                if (chars[i] == '?'){
                    sb.append('.');
                }
                //不是?的话，则就是普通字符，直接添进来
                else{
                    sb.append(chars[i]);
                }
            }
        }
        return sb.toString();
    }

    /**
     * 通配符模式
     * @param whitePath - 白名单地址
     * @param reqPath - 请求地址
     * @return
     */
    public static boolean checkWhiteList(String[] whitePath, String reqPath) {
        for (int i=0; i<whitePath.length; i++) {
            // 加上前缀:**/
            String regPath = getRegPath("**" + whitePath[i]);
            boolean isMatch = Pattern.compile(regPath).matcher(reqPath).matches();
            if (isMatch) {
                return true;
            }
        }
        return false;
    }

    /**
     * 通配符模式
     * @param whitePath - 白名单地址
     * @param reqPath - 请求地址
     * @return
     */
    public static boolean checkWhiteList(List<String> whitePath, String reqPath) {
        if (whitePath == null){
            return false;
        }
        for (String url : whitePath) {
            // 加上前缀:**/
            String regPath = getRegPath("**" + url);
            boolean isMatch = Pattern.compile(regPath).matcher(reqPath).matches();
            if (isMatch) {
                return true;
            }
        }
        return false;
    }
}
